iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0
Security

走進資安現場: JavaScript資安逆向工程超實戰系列 第 27

Day 27 當 JavaScript 遇上 WebAssembly

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250926/20169775hjDZABtKbm.jpg

本系列文章所討論的 JavaScript 資安與逆向工程技術,旨在分享知識、探討防禦之道,並促進技術交流。
所有內容僅供學術研究與學習,請勿用於任何非法或不道德的行為。
讀者應對自己的行為負完全責任。尊重法律與道德規範是所有技術人員應共同遵守的準則。

本文同步發佈:https://nicklabs.cc/javascript-security-webassembly-wasm

什麼是 WebAssembly?

WebAssembly(縮寫為 wasm)是一種可以在瀏覽器中執行的低階二進位格式,設計目標是讓 Web 具備接近原生程式的效能。

它允許開發者將 C、C++、Rust 等語言編譯後直接在瀏覽器中跑,而不是只依賴 JavaScript。

這讓一些運算密集的功能(例如影像處理、3D 渲染、加解密演算法)可以在網頁中更快執行。

WebAssembly 的優點

高效能

執行速度接近原生程式遠快於解釋型的 JavaScript。

跨平台

只要有支援 wasm 的瀏覽器(幾乎現代瀏覽器都支援)就能執行相同模組。

語言彈性

不再受限於 JavaScript 能使用多種語言編譯到 wasm。

安全沙箱

wasm 在瀏覽器中執行時仍受安全限制,不會隨意存取作業系統資源。

WebAssembly 的缺點

學習曲線較高

開發者需要熟悉編譯工具鏈對前端工程師來說比純 JavaScript 更複雜。

調試不便

相較於 JavaScript,wasm 只能看到編譯後的二進位格式,即使透過 DevTools 的 WebAssembly Debugger 也不如 JavaScript 容易使用斷點追蹤。

與瀏覽器 API 整合有限

wasm 本身無法直接操作 DOM 仍需要透過 JavaScript 做橋接。

什麼是 WAT 格式?

WebAssembly 是二進制格式瀏覽器能讀但人類很難直接看懂。

為了讓開發者能讀寫與理解定義了一個對應的文字表示法,叫做 WAT (WebAssembly Text Format)。

.wat 檔案本質上就是一個 人類可讀的組合語言風格程式碼與 .wasm 可以互相轉換。

簡單範例

簡單的 C 函式

int add(int a, int b) {
    return a + b;
}

編譯 wasm 用 wasm2wat 轉換

(module
  (func $add (param $a i32) (param $b i32) (result i32)
    local.get $a
    local.get $b
    i32.add
  )
  (export "add" (func $add))
)

逐行解釋

(func $add ...) 定義一個名為 add 的函式。

(param $a i32) (param $b i32) 表示輸入兩個 32 位元整數。

(result i32) 表示回傳一個 32 位元整數。

local.get $a 取出參數。

local.get $b 取出參數。

i32.add 執行整數加法。

(export "add" (func $add)) 匯出函式,讓 JavaScript 可以呼叫。

WebAssembly 是一種強大又安全的技術,能提升效能並保護程式邏輯。

但對資安研究員來說 wasm 提高了逆向成本,但可透過工具還原邏輯。

WebAssembly 並不是無法逆向只是更難逆向。


上一篇
Day 26 逆向實戰 - URL 驗證參數 (困難)
系列文
走進資安現場: JavaScript資安逆向工程超實戰27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言